package com.fh.common.query;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fh.common.exception.Assert;
import com.fh.common.query.annotation.QueryWrapperRule;
import com.fh.common.util.ConvertUtils;
import com.fh.common.util.ReflectUtils;
import com.fh.common.util.StringUtils;

import java.lang.reflect.Field;
import java.util.List;

/**
 * @author Qiu,Junda
 * @date 2019年4月3日
 * @description 判断类型，追加查询规则
 */
public class QueryWrapperUtil {
	
	/**
	 *  创建queryWrapper
	 * @param vo
	 * @return
	 */
	public static QueryWrapper buildQueryWrapper(Object vo) {
		QueryWrapper queryWrapper=new QueryWrapper();
		initQueryWrapper(queryWrapper, vo);
		return queryWrapper;
	}
	
	
	/**
	 * @param vo         前端传的查询VO对象，对象通过注解初始化QueryWrapper对象
	 */
	public static void initQueryWrapper(QueryWrapper<?> queryWrapper,Object vo) {
		Assert.isNull(queryWrapper, "queryWarpper未初始化");
		Assert.isNull(vo, "查询对象不能为null");
		List<Field> fields=ReflectUtils.getClassFieldsByAnnotation(vo, QueryWrapperRule.class);
		fields.forEach(field->{
			QueryWrapperRule queryWrapperule=field.getAnnotation(QueryWrapperRule.class);
			QueryRuleEnum queryRule=queryWrapperule.rule();
			String fieldName=queryWrapperule.fieldName();
			if(StringUtils.isEmpty(fieldName)) {
				fieldName=ConvertUtils.camelToUnderline(field.getName());
			}
			try {
				field.setAccessible(true);
				Object value=field.get(vo);
				field.setAccessible(false);
				addCriteria(queryWrapper, fieldName, queryRule, value);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		});
	}

	/**
	 * 
	 * @param queryWrapper QueryWrapper
	 * @param name         字段名字
	 * @param rule         查询规则
	 * @param value        查询条件值
	 */
	private static void addCriteria(QueryWrapper<?> queryWrapper, String name, QueryRuleEnum rule, Object value) {
		if (value == null || rule == null) {
			return;
		}
		switch (rule) {
		case GT:
			queryWrapper.gt(name, value);
			break;
		case GE:
			queryWrapper.ge(name, value);
			break;
		case LT:
			queryWrapper.lt(name, value);
			break;
		case LE:
			queryWrapper.le(name, value);
			break;
		case EQ:
			queryWrapper.eq(name, value);
			break;
		case NE:
			queryWrapper.ne(name, value);
			break;
		case IN:
			queryWrapper.in(name, (Object[]) value);
			break;
		case LIKE:
			queryWrapper.like(name, value);
			break;
		case LEFT_LIKE:
			queryWrapper.likeLeft(name, value);
			break;
		case RIGHT_LIKE:
			queryWrapper.likeRight(name, value);
			break;
		default:
			break;
		}
	}
	
//	public static void main(String[] args) {
//		SysFileVo fileVo=new SysFileVo();
//		fileVo.setCategoryId("1234");
//		fileVo.setFileName("testName");
//		fileVo.setUserId("userId456");
//		List<Field> fields=ReflectUtils.getClassFieldsByAnnotation(fileVo, QueryWrapperRule.class);
//		fields.forEach(field->{
//			QueryWrapperRule queryWrapperule=field.getAnnotation(QueryWrapperRule.class);
//			QueryRuleEnum queryRule=queryWrapperule.rule();
//			String fieldName=queryWrapperule.fieldName();
//			if(StringUtils.isEmpty(fieldName)) 
//				fieldName=field.getName();
//			try {
//				field.setAccessible(true);
//				Object value=field.get(fileVo);
//				System.out.println(queryRule.getValue()+"---"+fieldName+"---"+value);
//				field.setAccessible(false);
//			} catch (IllegalArgumentException e) {
//				e.printStackTrace();
//			} catch (IllegalAccessException e) {
//				e.printStackTrace();
//			}
//		});
//	}

}
